package com.yiyuan.app.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.guaike.core.mybatis.plugins.BaseDAO;
import com.yiyuan.app.entity.enums.EquityEnum;
import com.yiyuan.app.entity.po.MRecordProductLookPO;
import com.yiyuan.app.mapper.MRecordProductLookMapper;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

@Repository
public class MRecordProductLookDAO extends BaseDAO<MRecordProductLookMapper, MRecordProductLookPO> {

    public MRecordProductLookPO findUserOne(Long userId, Long roomId, String positionNo) {
        LambdaQueryWrapper<MRecordProductLookPO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MRecordProductLookPO::getUserId, userId);
        queryWrapper.eq(MRecordProductLookPO::getRoomId, roomId);
        queryWrapper.eq(MRecordProductLookPO::getPositionNo, positionNo);
        return getBaseMapper().selectOne(queryWrapper);
    }

    public MRecordProductLookPO findEnableOne(Long roomId, String positionNo, Integer productType) {
        LambdaQueryWrapper<MRecordProductLookPO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MRecordProductLookPO::getRoomId, roomId);
        queryWrapper.eq(MRecordProductLookPO::getPositionNo, positionNo);
        queryWrapper.eq(MRecordProductLookPO::getProductType, productType);
        queryWrapper.isNotNull(MRecordProductLookPO::getEndTime);
        queryWrapper.gt(MRecordProductLookPO::getEndTime, LocalDateTime.now());
        return getBaseMapper().selectOne(queryWrapper);
    }

    public Long checkOtherLockEnable(Long userId, Long roomId) {
        LambdaQueryWrapper<MRecordProductLookPO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MRecordProductLookPO::getRoomId, roomId);
        queryWrapper.ne(MRecordProductLookPO::getUserId, userId);
        queryWrapper.eq(MRecordProductLookPO::getProductType, EquityEnum.lock_machine.getCode());
        queryWrapper.isNotNull(MRecordProductLookPO::getEndTime);
        queryWrapper.gt(MRecordProductLookPO::getEndTime, LocalDateTime.now());
        return getBaseMapper().selectCount(queryWrapper);
    }

    public List<MRecordProductLookPO> findAllRepairByRoom(Long roomId) {
        LambdaQueryWrapper<MRecordProductLookPO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MRecordProductLookPO::getRoomId, roomId);
        queryWrapper.isNotNull(MRecordProductLookPO::getRepairTime);
        return getBaseMapper().selectList(queryWrapper);
    }

    public List<MRecordProductLookPO> findAllNormalNoEndByRoom(Long roomId) {
        LambdaQueryWrapper<MRecordProductLookPO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MRecordProductLookPO::getRoomId, roomId);
        queryWrapper.isNull(MRecordProductLookPO::getRepairTime);
        queryWrapper.isNotNull(MRecordProductLookPO::getEndTime);
        queryWrapper.gt(MRecordProductLookPO::getEndTime, LocalDateTime.now());
        return getBaseMapper().selectList(queryWrapper);
    }

    public int updateNormal(Long id, LocalDateTime endTime) {
        LambdaUpdateWrapper<MRecordProductLookPO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(MRecordProductLookPO::getEndTime, endTime);
        updateWrapper.set(MRecordProductLookPO::getRepairTime, null);
        updateWrapper.set(MRecordProductLookPO::getRemainTime, null);
        updateWrapper.eq(MRecordProductLookPO::getId, id);
        return getBaseMapper().update(new MRecordProductLookPO(), updateWrapper);
    }

    public int updateRepair(Long id, Integer remainMinute) {
        LambdaUpdateWrapper<MRecordProductLookPO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(MRecordProductLookPO::getEndTime, null);
        updateWrapper.set(MRecordProductLookPO::getRepairTime, LocalDateTime.now());
        updateWrapper.set(MRecordProductLookPO::getRemainTime, remainMinute);
        updateWrapper.eq(MRecordProductLookPO::getId, id);
        return getBaseMapper().update(new MRecordProductLookPO(), updateWrapper);
    }
}
